package com.itheima.d10_api_object;


/**
 * 浅克隆：
 * 拷贝出的新对象，与原对象中的数据一模一样（引用类型拷贝的只是地址）
 *
 * 深克隆：
 * 对象中基本类型的数据直接拷贝。
 * 对象中的字符串数据拷贝的还是地址。
 * 对象中还包含的其他对象，不会拷贝地址，会创建新对象。
 */
public class Test2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 目标：对象克隆。掌握Object类提供的对象克隆的方法。

        User u1 = new User(1, "zhangsan",
                "wo666",new double[]{99.0, 99.5});
        // 1、protected Object clone()：  object类的clone方法是protected受保护的
        //若子类与基类（父类）不在同一包中，那么在子类中，只有子类实例可以访问其从基类继承而来的protected方法，而在子类中不能访问基类实例（对象）（所调用）的protected方法。
        //u1.clone(); 报错

        System.out.println("======初始数据=====");
        System.out.println(u1.getId());
        System.out.println(u1.getUsername());
        System.out.println(u1.getPassword());
        System.out.println(u1.getScores());

        System.out.println("=====第一次深克隆完成======");
        User u2 = (User) u1.clone1();
        System.out.println(u2.getId());
        System.out.println(u2.getUsername());
        System.out.println(u2.getPassword());
        System.out.println(u2.getScores());    //深克隆，创建了新的数组对象

        System.out.println("=====第二次深克隆完成======");
        User u3 = (User) u2.clone1();
        System.out.println(u3.getId());
        System.out.println(u3.getUsername());
        System.out.println(u3.getPassword());
        System.out.println(u3.getScores());   //深克隆，创建了新的数组对象
        System.out.println(u3.equals(u2));
        System.out.println((u3 == u2));

        System.out.println("=====第一次浅克隆完成======");
        User u4 = (User) u1.clone();
        System.out.println(u4.getId());
        System.out.println(u4.getUsername());
        System.out.println(u4.getPassword());
        System.out.println(u4.getScores());
        System.out.println(u4.equals(u1));
        System.out.println((u4 == u1));

    }
}
